今天是第四天,從基本型態開始講吧,與大部分語言一樣有基礎的int、float、string,在此之上Go還有complex、array、slice、map、channel等進階型態,再來都會談到。
沒特別指定類別的話,宣告會是基礎型態int、unit,以電腦位元數決定是32還64
| 資料型別 | 下限 | 上限 |
|---|---|---|
| unit8 | 0 | 255 |
| unit16 | 0 | 65535 |
| unit32 | 0 | 4294967295 |
| unit64 | 0 | 18446744073709551615 |
| unit |
可以看出最大值是2^n-1
| 資料型別 | 下限 | 上限 |
|---|---|---|
| int8 | -128 | 127 |
| int16 | -32768 | 32767 |
| int32 | -2147483648 | 2147483647 |
| int64 | -9223372036854775808 | 9223372036854775807 |
| int |
這邊的話下限是-2^(n-1),上限是 2^(n-1)-1
有小數的數字,分為float32及float64
| 資料型別 | 標準 | 最大值 |
|---|---|---|
| float32 | IEEE-754 32 位元 | 3.4e38 |
| float64 | IEEE-754 64 位元 | 1.8e308 |
IEEE二進位浮點數算術標準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器所採用。
分true與false,預設為false
var a bool
fmt.Println(a) // false
b := true
fmt.Println(b) // true
string
正常狀況下使用的型別,通常不會使用其他兩種
rune
一種int32的類型,一個值代表一個Unicode碼
byte
一種unit8的類型,一個值代表一個ASCII碼
在大部分情形下,都是使用 string 型別,這篇文章對string與byte有很詳細的講解,想深入了解的話可以讀一下。
複數包涵兩種型態 complex64、complex128。有以下兩種宣告方法
c1 := complex(10, 11) // constructor init
c2 := 10 + 11i // complex number init syntax
不同型別的資料有時會需要互相轉換,但直接交換有時會出錯或喪失精準度,轉換格式如下type(變數)
// 宣告一個16位元整數,轉成8位元時發生截斷,因為8位元整數最大值是127
var a int16 = 128
fmt.Printf("%d \n", int8(a)) //-128
// 將浮點數轉成整數,會損失小數點後的精度
var b float32 = math.Pi
fmt.Printf("%d \n", int(b)) //3
Go格式化輸出中有%T可以查看該變數型別,另外也有unsafe.Sizeof()可以觀看占用的記憶體大小,下面為簡單範例
var a int8 = 30
fmt.Printf("int8 長度= %d byte, 型態= %T", unsafe.Sizeof(a), a)
//int8 長度= 1 byte, 型態= int8
var b int32 = 30
fmt.Printf("int32 長度= %d byte, 型態= %T", unsafe.Sizeof(b), b)
//int8 長度= 4 byte, 型態= int32
[Golang] 程式設計教學:資料型態 (Data Type):
https://opensourcedoc.com/golang-programming/data-type/
day4 - 基本型別:
https://ithelp.ithome.com.tw/articles/10214468
徹底弄清Golang中[]byte與string轉換
https://www.gushiciku.cn/pl/pDSl/zh-tw